#include <iostream>
#include <assert.h>

typedef unsigned char lu_byte;
#define LUA_TNUMBER		3
#define makevariant(t,v)	((t) | ((v) << 4))
#define LUA_VNUMINT	makevariant(LUA_TNUMBER, 0)  /* integer numbers */
#define LUA_VNUMFLT	makevariant(LUA_TNUMBER, 1)  /* float numbers */


#define rawtt(o)	((o)->tt_)
#define checktag(o,t)		(rawtt(o) == (t))
#define ttisfloat(o)		checktag((o), LUA_VNUMFLT)
#define ttisinteger(o)		checktag((o), LUA_VNUMINT)
#define lua_assert(c)           assert(c)
#define val_(o)		((o)->value_)
#define settt_(o,t)	((o)->tt_=(t))
#define LUA_NUMBER	double
#define LUA_INTEGER	long long
typedef LUA_NUMBER lua_Number;
typedef LUA_INTEGER lua_Integer;
typedef union Value {
// 暂时的没用到，先删了
  lua_Integer i;   // 数字
  lua_Number n;    // 浮点
} Value;
#define TValuefields	Value value_; lu_byte tt_
typedef struct TValue {
  TValuefields;
} TValue;
// 赋值，设置类型为float
#define setfltvalue(obj,x) \
  { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_VNUMFLT); }
// 断言是float, 赋值
#define chgfltvalue(obj,x) \
  { TValue *io=(obj); lua_assert(ttisfloat(io)); val_(io).n=(x); }
// 赋值，设置类型为int
#define setivalue(obj,x) \
  { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_VNUMINT); }
// 断言是int, 赋值
#define chgivalue(obj,x) \
  { TValue *io=(obj); lua_assert(ttisinteger(io)); val_(io).i=(x); }

int main()
{
    
  {
    // 使用断点查看p1 p2的内存
    lu_byte bol1 = LUA_VNUMINT;
    lu_byte bol2 = LUA_VNUMFLT;
    lu_byte* p1 = &bol1;
    lu_byte* p2 = &bol2;
    int a = 0;
  }

  {
    TValue my_int;
    setivalue(&my_int, 1);
    assert(ttisinteger(&my_int));
    chgivalue(&my_int, 2);
    assert(my_int.value_.i == 2);

    TValue my_float;
    setfltvalue(&my_float, 1.0f);
    assert(ttisfloat(&my_float));
    chgfltvalue(&my_float, 2.0f)
    assert(my_float.value_.n == 2.0f);
  }
    int a = 0;
    std::cin>>a;
    return 0;
}